/*
 * ManageCacheFile.h
 *
 *  Created on: 30/10/2011
 *      Author: utn_so
 */

#ifndef MANAGECACHEFILE_H_
#define MANAGECACHEFILE_H_

#include <stdio.h>
#include <string.h>
#include <pthread.h>
#include <stdlib.h>
#include <stdint.h>

#include "LogCacheFile.h"
#include "fat32.h"
#include "persistencia.h"
#include "logfile.h"
#include "CacheDirectorio.h"

//tamaño del vector cahe de bloques para cada archivo
uint32_t sizeOfCacheData;

//Estrucutura de la cahe de bloques
typedef struct {
	unsigned char* bloque;
	uint32_t sectorIncicio;
	int32_t idBloque;
	int32_t markOfWrite;
} cacheData;

//Estructura de la cahe de archivos
struct cacheFile{
	char* nameOfFile;
	ListaDirectorios* listaDirectorios;
	uint32_t numberOfInstance;
	cacheData* dataVector;
	struct cacheFile *sig;
}typedef cacheFile;

//Cache Principal
cacheFile* cacheList;

//Recibe el tamaño de la cahe segun archivo de configuracion y define
//la cantidad de entradas para vector de bloques
void establecerTamanioDeLaCache(uint32_t);

//Inicializa la CahePrincipal
void initializeCacheFile();

//Da de alta un nuevo archivo en la cachePrincipal
int32_t addCacheFile(const char* nameOfFile, ListaDirectorios* directoryList);

//Elimina el Archivo de la cachePrincipal y hace un flush
int32_t deleteCacheFileFlush(const char*);

//Elimina el archivo de la cache principal sin Flush
int32_t deleteCacheFileNoFlush(const char*);

ListaDirectorios* deleteCacheFileFlushTruncate(const char* file);

//busca un bloque, si no lo encuntra devuelve null
int32_t searchCacheData(const char* pathSearch, uint32_t idBloque, unsigned char* buffer);

// agrega un bloque a la cache del archivo, devuelve -1 si no pudo
//Parametos: (path, idCluster, cluster, operacion, sectorInicio).
//Operacion = 1 modificar; Operacion = 0 consulta.
#define ESCRITURA	1
#define LECTURA		0
int32_t addCacheData(const char*, uint32_t,unsigned char*, uint32_t, uint32_t);

//funcion para el tratamiento de la señal SIGUSR1
void treatSignalForCache(int32_t signal);

//funcion que busca un archivo en la cache, en caso de encontrarse devuelve su lista de directorios
//e incrementa en 1 su numero de instancias, de lo contrario devuelve null
ListaDirectorios* buscarArchivoCache(const char*);

//Funcion que hace flush de todos los cluster que estan modificados de un archivo en la cache
void flushCacheDataForFile(const char*);

//funcion renombrar un archivo en la cache
//(path viejo, path nuevo, listaDirectoriosNvo)
uint32_t renameCacheFile(const char*,const char*, ListaDirectorios*);


/***************************************************************/

//Funciones Aux para Realizar Las funciones de arriba.

cacheFile* searchCacheFile(const char*);
uint32_t inicializarCache(cacheData*);
cacheData* buscarBloque(cacheData*,uint32_t );
void correrUnaPosicionFrom(cacheData*, uint32_t);
int32_t agregarCache(cacheData *vectorCache, cacheData newCache/*, unsigned char *bloque*/);
int32_t insercionEnVectorInicial(cacheData *vectorCache, cacheData newCache/*, unsigned char *bloque*/);
int32_t insercionPorCola(cacheData *vectorCache, cacheData newCache/*, unsigned char *bloque*/);
void flushCacheFile(cacheData*);

#endif /* MANAGECACHEFILE_H_ */
